/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.munif.util;

import br.com.munif.util.Persistencia;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.persistence.GeneratedValue;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.swing.JOptionPane;

/**
 *
 * @author munif
 */
public class GeraCadastro {

    private static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

    public static void main(String args[]) throws Throwable {
        String nomesClasse = JOptionPane.showInputDialog("Digite o nome da entidade");
        for (String nomeClasse : nomesClasse.split(",")) {
            Class classe = Class.forName("br.com.automenu.web.entidades." + nomeClasse);
            String primeiroAtributo = Persistencia.primeiroAtributo(classe).getName();
            List<Field> atributos = Persistencia.getAtributos(classe);
            criaFacade(classe, nomeClasse, primeiroAtributo);
            criaControle(classe, nomeClasse);
            criaListaXHTML(classe, nomeClasse, primeiroAtributo);
            criaEditaXHTML(classe, nomeClasse, primeiroAtributo, atributos);
        }
    }

    public static void criaEditaXHTML(Class classe, String nomeClasse, String primeiroAtributo, List<Field> atributos) throws IOException {
        String nomeControle = nomeClasse.substring(0, 1).toLowerCase() + nomeClasse.substring(1);
        FileWriter fw;
        File pasta = new File("web/cad" + nomeClasse.toLowerCase());
        System.out.println(pasta.getAbsolutePath());
        if (!pasta.exists()) {
            pasta.mkdir();
        }
        fw = new FileWriter("web/cad" + nomeClasse.toLowerCase() + "/edita.xhtml", false);
        String atributosEditaveis = "";
        for (Field f : atributos) {
            if (f.isAnnotationPresent(GeneratedValue.class)) {
                continue;
            }
            atributosEditaveis += "<p:row>\n";
            atributosEditaveis += "<p:column><h:outputText value=\"" + f.getName() + ":\"/></p:column>\n";
            atributosEditaveis += "<p:column colspan=\"5\">\n";
            if (f.isAnnotationPresent(ManyToOne.class)) {
                atributosEditaveis += "<p:selectOneMenu id=\"" + f.getName() + "\" value=\"#{" + nomeControle + "Controlador.entidade." + f.getName() + "}\" effect=\"fade\" converter=\"#{sistemaControlador.converter('" + f.getType().getCanonicalName() + "')}\">  \n"
                        + "<f:selectItems value=\"#{sistemaControlador.lista('" + f.getType().getCanonicalName() + "')}\" var=\"item\" itemLabel=\"#{item}\" itemValue=\"#{item}\"/>  \n"
                        + "</p:selectOneMenu>";

            } else if (f.isAnnotationPresent(Temporal.class)) {
                Temporal t = f.getAnnotation(Temporal.class);
                String mascara = "dd/MM/yyyy HH:mm:ss";
                if (t.value().equals(TemporalType.DATE)) {
                    mascara = "dd/MM/yyyy";
                }
                if (t.value().equals(TemporalType.TIME)) {
                    mascara = "HH:mm:ss";
                }

                atributosEditaveis += "<p:calendar id=\"" + f.getName() + "\"  value=\"#{" + nomeControle + "Controlador.entidade." + f.getName() + "}\" pattern=\"" + mascara + "\"  effect=\"slide\" /> \n";


            } else if (f.getType().equals(Boolean.class)) {
                //<p:selectBooleanCheckbox value="#{formBean.value1}" />
                atributosEditaveis += "<p:selectBooleanCheckbox id=\"" + f.getName() + "\" value=\"#{" + nomeControle + "Controlador.entidade." + f.getName() + "}\" />\n";
            } else if (f.getType().isEnum()) {
                /*
                 <p:selectOneRadio id="tipoPessoa" value="#{pessoaControlador.entidade.tipoPessoa}">  
                 <f:selectItem itemLabel="Física" itemValue="FISICA" />  
                 <f:selectItem itemLabel="Jurídica" itemValue="JURIDICA" />  
                 </p:selectOneRadio> 
                 */
                atributosEditaveis += "<p:selectOneRadio id=\"" + f.getName() + "\" value=\"#{" + nomeControle + "Controlador.entidade." + f.getName() + "}\" >\n";
                for (Object obj : f.getType().getEnumConstants()) {
                    atributosEditaveis += "<f:selectItem itemLabel=\"" + obj.toString() + "\" itemValue=\"" + obj + "\" />";
                }
                atributosEditaveis += "</p:selectOneRadio>";
            } else {
                atributosEditaveis += "<p:inputText id=\"" + f.getName() + "\" size=\"50\"  value=\"#{" + nomeControle + "Controlador.entidade." + f.getName() + "}\" />\n";
            }
            atributosEditaveis += "<p:message for=\"" + f.getName() + "\" showDetail=\"true\" />\n";
            atributosEditaveis += "</p:column>\n";
            atributosEditaveis += "</p:row>\n";

        }

        fw.write("<?xml version='1.0' encoding='UTF-8' ?>\n"
                + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
                + "\n"
                + "<!--\n" + " * Codigo gerado automaticamente em " + sdf.format(new Date()) + "\n" + " * www.munif.com.br" + "\n" + "*/\n\n-->"
                + "\n"
                + "<ui:composition xmlns:ui=\"http://java.sun.com/jsf/facelets\" \n"
                + "                xmlns:h=\"http://java.sun.com/jsf/html\"\n"
                + "                xmlns:p=\"http://primefaces.org/ui\"\n"
                + "                template=\"/modelo.xhtml\"\n"
                + "                xmlns:f=\"http://java.sun.com/jsf/core\">\n"
                + "\n"
                + "    <ui:define name=\"topo\"><p:messages id=\"msgs\" showDetail=\"false\" /></ui:define>\n"
                + "    <ui:define name=\"corpo\">\n"
                + "        <h:form id=\"formulario\">\n"
                + " <p:panelGrid style=\"margin-top:20px\">\n"
                + "                <f:facet name=\"header\">\n"
                + "                    <p:row>\n"
                + "                        <p:column colspan=\"6\">Editando " + nomeClasse + "</p:column>      \n"
                + "                    </p:row>\n"
                + "                </f:facet>"
                + atributosEditaveis
                + "                <f:facet name=\"footer\">\n"
                + "                    <p:row>\n"
                + "                        <p:column colspan=\"6\" style=\"text-align: right\">\n"
                + "                            <p:commandButton actionListener=\"#{" + nomeControle + "Controlador.salvar()}\" action=\"lista\" update=\"msgs\" ajax=\"false\" value=\"Salvar\"/> \n"
                + "                            <p:spacer width=\"20\"/>\n"
                + "                            <p:commandButton actionListener=\"#{" + nomeControle + "Controlador.cancelar()}\" action=\"lista\" update=\"msgs\" ajax=\"false\" value=\"Cancelar\" immediate=\"true\"/> \n"
                + "                        </p:column>\n"
                + "                    </p:row>\n"
                + "                </f:facet>\n"
                + "            </p:panelGrid>\n"
                + "        </h:form>\n"
                + "    </ui:define>\n"
                + "</ui:composition>");
        fw.close();
    }

    public static void criaListaXHTML(Class classe, String nomeClasse, String primeiroAtributo) throws IOException {
        String nomeControle = nomeClasse.substring(0, 1).toLowerCase() + nomeClasse.substring(1);
        FileWriter fw;
        File pasta = new File("web/cad" + nomeClasse.toLowerCase());
        if (!pasta.exists()) {
            pasta.mkdir();
        }
        fw = new FileWriter("web/cad" + nomeClasse.toLowerCase() + "/lista.xhtml", false);
        fw.write("<?xml version='1.0' encoding='UTF-8' ?>\n"
                + "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"
                + "\n"
                + "<!--\n" + " * Codigo gerado automaticamente em " + sdf.format(new Date()) + "\n" + " * www.munif.com.br" + "\n" + "*/\n\n-->"
                + "\n"
                + "<ui:composition xmlns:ui=\"http://java.sun.com/jsf/facelets\" \n"
                + "                xmlns:h=\"http://java.sun.com/jsf/html\"\n"
                + "                xmlns:p=\"http://primefaces.org/ui\"\n"
                + "                template=\"/modelo.xhtml\">\n"
                + "    <ui:define name=\"topo\"></ui:define>\n"
                + "    <ui:define name=\"corpo\">\n"
                + "        <h:form id=\"formulario\">\n"
                + "            <p:panel>\n"
                + "                <h:outputText value=\"Lista de " + classe.getSimpleName() + "\" />\n"
                + "                <p:messages id=\"msgs\" showDetail=\"true\" />\n"
                + "                <br/>\n"
                + "                <p:panel>\n"
                + "                    <h:outputText value=\"Filtro\"/>\n"
                + "                    <p:inputText value=\"#{" + nomeControle + "Controlador.filtro}\"/>\n"
                + "                    <p:commandButton actionListener=\"#{" + nomeControle + "Controlador.filtrar()}\" value=\"Filtrar\" ajax=\"false\" />\n"
                + "                    <p:commandButton actionListener=\"#{" + nomeControle + "Controlador.novo()}\" value=\"Novo\" ajax=\"false\" action=\"edita\" />\n"
                + "                </p:panel>\n"
                + "                <p:dataTable value=\"#{" + nomeControle + "Controlador.lista}\" emptyMessage=\"Nenhum registro corresponde ao filtro.\" var=\"obj\">\n"
                + "                    <p:column headerText=\"" + nomeClasse + "\" sortBy=\"#{obj." + primeiroAtributo + "}\" >\n"
                + "                        <h:outputText value=\"#{obj." + primeiroAtributo + "}\" />\n"
                + "                    </p:column>\n"
                + "                    <p:column headerText=\"Editar\" style=\"width: 10%; text-align: center;\">                                               \n"
                + "                        <p:commandButton id=\"editarLink\" action=\"edita\" actionListener=\"#{" + nomeControle + "Controlador.setEntidade(obj)}\" icon=\"ui-icon-search\" ajax=\"false\" /> \n"
                + "                    </p:column>\n"
                + "                    <p:column style=\"text-align: center\"  headerText=\"Excluir\" >\n"
                + "                        <p:commandButton icon=\"ui-icon-trash\" update=\"@form\" actionListener=\"#{" + nomeControle + "Controlador.excluir(obj)}\" onclick=\"if(!confirm('Deseja excluir este registro?')) return false;\"/>\n"
                + "                    </p:column>\n"
                + "                </p:dataTable>\n"
                + "            </p:panel>\n"
                + "        </h:form>\n"
                + "    </ui:define>\n"
                + "</ui:composition>\n"
                + "");
        fw.close();

    }

    public static void criaFacade(Class classe, String nomeClasse, String primeiroAtributo) throws IOException {
        FileWriter fw;
        fw = new FileWriter("src/java/br/com/automenu/web/negocio/" + classe.getSimpleName() + "Facade.java", false);
        fw.write("/*\n" + " * Codigo gerado automaticamente em " + sdf.format(new Date()) + "\n" + " * www.munif.com.br" + "\n" + "*/\n\n");

        fw.write("package br.com.automenu.web.negocio;\n"
                + "\n"
                + "import br.com.automenu.web.entidades.*;\n"
                + "import br.com.munif.util.CrudFacade;\n"
                + "import br.com.munif.util.Persistencia;\n"
                + "import java.util.List;\n"
                + "import javax.persistence.EntityManager;\n"
                + "import javax.persistence.EntityManagerFactory;\n"
                + "import javax.persistence.Query;\n"
                + "\n"
                + "/**\n"
                + " *\n"
                + " * @author munif\n"
                + " */\n"
                + "public class " + nomeClasse + "Facade {\n"
                + "\n"
                + "    private static " + nomeClasse + "Facade instance = new " + nomeClasse + "Facade();\n"
                + "\n"
                + "    public static " + nomeClasse + "Facade getInstance() {\n"
                + "        return instance;\n"
                + "    }\n"
                + "\n"
                + "    public List<" + nomeClasse + "> listaFiltrando(String filtro) {\n"
                + "        EntityManager em = Persistencia.getTlem().get();\n"
                + "        Query q = em.createQuery(\"from " + nomeClasse + " obj where lower(obj." + primeiroAtributo + ") like lower(:filtro) order by obj." + primeiroAtributo + "\");\n"
                + "        q.setParameter(\"filtro\", \"%\" + filtro + \"%\");\n"
                + "        q.setMaxResults(CrudFacade.MAXCONSULTA);\n"
                + "        return q.getResultList();\n"
                + "    }\n"
                + "\n"
                + "    public List<" + nomeClasse + "> lista () {\n"
                + "        EntityManager em = Persistencia.getTlem().get();\n"
                + "        Query q = em.createQuery(\"from " + nomeClasse + " obj order by obj." + primeiroAtributo + "\");\n"
                + "        q.setMaxResults(CrudFacade.MAXCONSULTA);\n"
                + "        return q.getResultList();\n"
                + "    }\n"
                + "}\n");
        fw.close();
    }

    public static void criaControle(Class classe, String nomeClasse) throws IOException {
        FileWriter fw;
        fw = new FileWriter("src/java/br/com/automenu/web/controle/" + classe.getSimpleName() + "Controlador.java", false);
        fw.write("/*\n" + " * Codigo gerado automaticamente em " + sdf.format(new Date()) + "\n" + " * www.munif.com.br" + "\n" + "*/\n\n");

        fw.write("package br.com.automenu.web.controle;\n"
                + "\n"
                + "import br.com.automenu.web.entidades.*;\n"
                + "import br.com.automenu.web.negocio.*;\n"
                + "import br.com.munif.util.CrudFacade;\n"
                + "import br.com.munif.util.FacesUtil;\n"
                + "import java.io.Serializable;\n"
                + "import java.util.List;\n"
                + "import javax.faces.bean.ManagedBean;\n"
                + "import javax.faces.bean.SessionScoped;\n"
                + "\n"
                + "/**\n"
                + " *\n"
                + " * @author munif\n"
                + " */\n"
                + "@SessionScoped\n"
                + "@ManagedBean\n"
                + "public class " + classe.getSimpleName() + "Controlador implements Serializable {\n"
                + "\n"
                + "    private " + classe.getSimpleName() + " entidade;\n"
                + "    private List<" + classe.getSimpleName() + "> lista;\n"
                + "    private String filtro;\n"
                + "\n"
                + "    public String getFiltro() {\n"
                + "        return filtro;\n"
                + "    }\n"
                + "\n"
                + "    public void setFiltro(String filtro) {\n"
                + "        this.filtro = filtro;\n"
                + "    }\n"
                + "\n"
                + "    public " + classe.getSimpleName() + " getEntidade() {\n"
                + "        return entidade;\n"
                + "    }\n"
                + "\n"
                + "    public void setEntidade(" + classe.getSimpleName() + " entidade) {\n"
                + "        this.entidade = entidade;\n"
                + "    }\n"
                + "\n"
                + "    public List<" + classe.getSimpleName() + "> getLista() {\n"
                + "        if (lista == null) {\n"
                + "            lista = " + classe.getSimpleName() + "Facade.getInstance().lista();\n"
                + "        }\n"
                + "        return lista;\n"
                + "    }\n"
                + "\n"
                + "    public void setLista(List<" + classe.getSimpleName() + "> lista) {\n"
                + "        this.lista = lista;\n"
                + "    }\n"
                + "\n"
                + "    public void novo() {\n"
                + "        entidade = new " + classe.getSimpleName() + "();\n"
                + "    }\n"
                + "\n"
                + "    public void excluir(" + classe.getSimpleName() + " aRemover) {\n"
                + "        CrudFacade.getInstance().remover(aRemover);\n"
                + "        FacesUtil.addMessageInfo(\"Informação\", \"O objeto foi excluído.\");\n"
                + "        lista=null;\n"
                + "    }\n"
                + "\n"
                + "    public void salvar() {\n"
                + "        if (entidade.getId() == null) {\n"
                + "            CrudFacade.getInstance().inserir(entidade);\n"
                + "            FacesUtil.addMessageInfo(\"Informação\", \"O objeto foi inserido.\");\n"
                + "        } else {\n"
                + "            CrudFacade.getInstance().alterar(entidade);\n"
                + "            FacesUtil.addMessageInfo(\"Informação\", \"O objeto foi alterado.\");\n"
                + "        }\n"
                + "        lista=null;\n"
                + "    }\n"
                + "\n"
                + "    public void cancelar() {\n"
                + "        entidade = null;\n"
                + "        FacesUtil.addMessageWarn(\"Aviso\", \"A operação foi cancelada\");\n"
                + "    }\n"
                + "\n"
                + "    public void filtrar() {\n"
                + "        if (filtro != null) {\n"
                + "            lista = " + classe.getSimpleName() + "Facade.getInstance().listaFiltrando(filtro);\n"
                + "        }\n"
                + "    }\n"
                + "}\n"
                + "");
        fw.close();
    }
}
